21.7 Beispiel einer MDI-Anwendung
 
Das folgende Beispiel enthält einige der vorher besprochenen Elemente. Der Code beschränkt sich auf das Wesentliche und weist über die MDI-typischen Anweisungen keine weiteren Funktionalitäten auf.
Das Hauptmenü enthält zwei Menüelemente: Datei und Fenster. Datei hat ein Untermenü mit den beiden Punkten Neu und Beenden. Fenster ist nach dem Start der Anwendung deaktiviert und wird erst beim Öffnen des ersten Subfensters aktiviert. Falls zur Laufzeit alle Subfenster geschlossen werden, muss Fenster auch wieder deaktiviert werden. Wir erreichen das, indem wir den dazu erforderlichen Code bei Auslösung des Ereignisses MdiChildActivate, das nicht nur bei der Aktivierung, sondern zusätzlich auch beim Schließen eines Subfensters auftritt, ausführen. Im Ereignishandler wird die Eigenschaft ActiveMdiChild überprüft: Sie liefert null, wenn kein Subfenster geöffnet ist.
Das Schließen des MDI-Haupt- und der MDI-Subfenster erfordert die ausdrückliche Bestätigung des Anwenders. Das ist in den Ereignissen FormClosing codiert. Beachten Sie, dass bei einem vom Hauptfenster eingeleiteten Schließvorgang ein geöffnetes Subfenster in jedem Fall noch die Möglichkeit hat, das Schließen zu verhindern.
Das Subfenster hat eine Menüleiste mit den Elementen Datei und Bearbeiten. Die beiden Datei-Menüs sollen zur Laufzeit in der Weise zusammengeführt werden, dass das des Subfensters das des Hauptfensters ergänzt. Darüber hinaus sollen die einzelnen Menüelemente nicht nur dem Untermenü angehängt, sondern konventionsgemäß platziert werden, d. h. zuerst Neu, dann Speichern und Speichern unter und zum Schluss Beenden. Erreicht wird das durch die entsprechenden Einstellungen im Eigenschaftsfenster.
Das Menü Bearbeiten, das zur Menüleiste des Subfensters gehört, soll sich zwischen Datei und Fenster des Hauptfensters positionieren. Auch das wird durch die dazu erforderlichen Eigenschaftseinstellungen im Eigenschaftsfenster bewirkt.
Einen Nebeneffekt werden Sie feststellen, wenn Ihr Subfenster eine Menüleiste hat: Nach dem Zusammenführen wird im Subfenster auch dann die Menüleiste angezeigt, wenn sie aufgrund des Zusammenführens leer ist. Hier hilft nur eine Maßnahme: Legen Sie für das ToolStripMenu-Objekt Visible=true fest.
 Hier klicken, um das Bild zu vergrößern
Abbildung 21.3 Ausgabe des Beispiels »MdiDemo«
| // --------------------------------------------------------------
|
| // Beispiel: ...\Kapitel 21\MdiDemo
|
| // --------------------------------------------------------------
|
| public partial class Form1 : Form {
|
| private int documentCounter;
|
| // ein neues untergeordnetes Fenster anzeigen
|
| private void menuNeu_Click(object sender, EventArgs e) {
|
| Document frm = new Document();
|
| frm.MdiParent = this;
|
| frm.Text = "Dokument " + ++documentCounter;
|
| frm.Show();
|
| menuFenster.Enabled = true;
|
| }
|
| private void Form1_MdiChildActivate(object sender, EventArgs e) {
|
| // wenn kein Subfenster aktiv ist, das Menü 'Fenster' deaktivieren
|
| if (this.ActiveMdiChild == null)
|
| this.menuFenster.Enabled = false;
|
| }
|
| // Diese Methode ist mit den Click-Ereignissen der Menüelemente
|
| // 'überlappend', 'horizontal' und 'vertikal' verknüpft
|
| private void ArrangeSubWindows(object sender, EventArgs e) {
|
| if (sender == menuUeberlappend)
|
| this.LayoutMdi(MdiLayout.Cascade);
|
| else if (sender == menuUntereinander)
|
| this.LayoutMdi(MdiLayout.TileHorizontal);
|
| else
|
| this.LayoutMdi(MdiLayout.TileVertical);
|
| }
|
| // Bestätigen lassen, ob die Anwendung geschlossen werden soll
|
| private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
|
| string strMeldung = "Wollen Sie die Anwendung beenden?";
|
| DialogResult dr = MessageBox.Show(strMeldung,
|
| Application.ProductName, MessageBoxButtons.YesNo);
|
| if (dr == DialogResult.No)
|
| e.Cancel = true;
|
| }
|
| }
|
|